#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
using namespace std;

void PrintSig(sigset_t &pending)
{
    cout << "pending bitMap:";
    for (int sig = 31; sig >= 1; sig--)
    {
        if (sigismember(&pending, sig))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
void handler(int signo)
{ // 2.获取pending
    sigset_t pending;
    sigemptyset(&pending);
    sigpending(&pending);
    cout<<"正在递达:";
    PrintSig(pending);
    cout << "get a signo:" << signo << endl;
}
int main()
{
    // 对2号信号进行捕捉
    signal(2, handler);
    // 1.屏蔽2号信号
    sigset_t block, oblock;                            // 定义一个信号集.注意这里仅仅是在栈上开辟了空间,还没有设置进内核.
    sigemptyset(&block);                               // 清空信号集
    sigemptyset(&oblock);                              // 清空信号集
    sigaddset(&block, 2);                              // 添加信号
    int n = sigprocmask(SIG_SETMASK, &block, &oblock); // 将信号集添加到内核中,2表示阻塞,1表示解除阻塞,0表示获取阻塞信号集
    if (n == 0)
    {
        cout << "block success" << endl;
    }
    else
    {
        cout << "block fail" << endl;
    }
    int cnt = 0;
    while (true)
    {
        // 2.获取pending
        sigset_t pending;
        sigemptyset(&pending);
        n = sigpending(&pending);
        PrintSig(pending);
        if (n == 0)
        {
            //            cout << "get pending success" << endl;
        }
        else
        {
            cout << "get pending fail" << endl;
        }
        cnt++;
        sleep(1);
        if (cnt == 10)
        {
            n = sigprocmask(SIG_UNBLOCK, &block, &oblock);
            if (n != 0)
            {
                cout << "unblock fail" << endl;
            }
        }
    }
    return 0;
}

// int main()
// {
//     pid_t id = fork();
//     if(id==0)
//     {
//         int a = 10;
//         int b  = a/0;
//         exit(0);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id,&status,0);
//     if(rid>0)
//     {
//         cout<<"child process exit status is "<<status<<endl;
//         cout<<"exit code:"<< ((status>>8)&0xFF)<<endl;
//         cout<<"exit siangl:"<< ((status)&0x7F)<<endl;
//         cout<<"core dump:"<< ((status>>7)&0x1)<<endl;
//     }
//     return 0;
// }

// int main()
// {
//     cout<<"begin"<<endl;
//     int a  =10;
//     int b = a/0;
//     cout<<"end"<<endl;
//     return 0;
// }